﻿using System;
using System.Linq;
using System.Text;
using Spring.Data.Core;
using System.Data;
using System.Collections;
using Spring.Data;
using Spring.Data.Common;
using GestionadorBaseDatos;
using CRUD.InterfaceDAO;
namespace CRUD.DAO
{
    /// <summary>
    /// Clase encargada de interactuar con la tabla apuesta del modelo
    /// </summary>
    public class ApuestaDao : AdoDaoSupport, IDaoApuesta
    {
        /// <summary>
        /// strings para las consultas de las tablas dado el caso
        /// </summary>
        #region Querys para metodos
        private string sqlByNick = "select idApuesta, monto, fecha, idParticipanteApuesta, idCategoriaApuesta, idEventoApuesta, nicknameApuesta, idFormaPagoApuesta from apuesta where nicknameApuesta = @nicknameFk";
        private string sqlByPago = "select idApuesta, monto, fecha, opcionPr, nicknameFk, idPago, idEvento, idCategoria from apuesta where idPago = @idPago";
        private string sqlByEvento = "select idApuesta, monto, fecha, idParticipanteApuesta, idCategoriaApuesta, idEventoApuesta, nicknameApuesta, idFormaPagoApuesta from apuesta  where idEventoApuesta = @idEvento";
        private string SQL = @"select idApuesta, monto, fecha, opcionPr, nicknameFk, idPago, idEvento, idCategoria from apuesta where idApuesta = @idApuesta";
        private string sql = "select idApuesta, monto, fecha, idParticipanteApuesta, idCategoriaApuesta, idEventoApuesta, nicknameApuesta, idFormaPagoApuesta from apuesta ";
        private string sqlInsert = "INSERT INTO apuesta (monto, fecha, idParticipanteApuesta, idCategoriaApuesta, idEventoApuesta, nicknameApuesta, idFormaPagoApuesta) VALUES (@monto, @fecha, @idParticipanteApuesta, @idCategoriaApuesta, @idEventoApuesta, @nicknameApuesta, @idFormaPagoApuesta)";

        # endregion

        # region metodos
        
        /// <summary>
        /// metodo para acceder y consultar la lista de apuestas de la bd
        /// </summary>
        /// <returns>lista con las apuestas del sistema</returns>
        public virtual IList GetAll()
        {
            return (IList)AdoTemplate.QueryWithRowMapper(CommandType.Text, sql, new ApuestaRowMapper());
                
        }

        /// <summary>
        /// metodo para insertar en la bd una apuesta
        /// </summary>
        /// <param name="crear">apuesta a agregar</param>
        public void Insert(Apuesta crear)
        {
          
            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();
            dbParameters.Add("@monto", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.Monto;
            dbParameters.Add("@fecha", MySql.Data.MySqlClient.MySqlDbType.DateTime, 50).Value = crear.FechaApuesta;
            dbParameters.Add("@idParticipanteApuesta", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.ProporcionAsociado.Participante.IdParticipante;
            dbParameters.Add("@idCategoriaApuesta", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.ProporcionAsociado.Participante.CategoriaFk.IdCategoria;
            dbParameters.Add("@idEventoApuesta", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.ProporcionAsociado.EventoAsociado.IdEvento;
            dbParameters.Add("@nicknameApuesta", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.PagoAsociado.UsuarioAsociado.Nickname;
            dbParameters.Add("@idFormaPagoApuesta", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.PagoAsociado.FormaPagoAsociado.IdFormaPago;
            AdoTemplate.ExecuteNonQuery(CommandType.Text, sqlInsert, dbParameters);


        }

        /// <summary>
        /// metodo para obtener lista de apuesta segun un medio de pago
        /// </summary>
        /// <param name="pago">pago a buscar</param>
        /// <returns>lista apuestas</returns>
        public virtual IList GetByPago(Pago pago)
        {
            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();
            dbParameters.Add("@idPago", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = pago.FormaPagoAsociado.IdFormaPago;
            return (IList)AdoTemplate.QueryWithRowMapper(CommandType.Text, sqlByPago, new ApuestaRowMapper());            
        }

        /// <summary>
        /// metodo para obetener lista de apuestas segun un evento
        /// </summary>
        /// <param name="evento">evento con el id parametro</param>
        /// <returns>lista de apuestas</returns>
        public virtual IList GetByEvento(Evento evento)
        {
            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();
            dbParameters.Add("@idEvento", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = evento.IdEvento;

            return (IList)AdoTemplate.QueryWithRowMapper(CommandType.Text, sqlByEvento, new ApuestaRowMapper(),dbParameters);
            
        }

        /// <summary>
        /// metodo para buscar una apuesta segun un usuario
        /// </summary>
        /// <param name="nick">nick a buscar</param>
        /// <returns>lista de eventos</returns>
        public IList GetById(string nick)
        {
            string oma = nick;
            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();
            dbParameters.Add("@nicknameFk", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = nick;
            IList toma = (IList)AdoTemplate.QueryWithRowMapper(CommandType.Text, sqlByNick, new ApuestaRowMapper(), dbParameters);
            return toma;            
        }

  
        # endregion
    }
}
